home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / nan_news / toolkit / atprompt.prg < prev    next >
Text File  |  1991-08-15  |  17KB  |  497 lines

  1. /*
  2.  * File......: ATPROMPT.PRG
  3.  * Author....: Ted Means
  4.  * Date......: $Date:   15 Aug 1991 23:06:20  $
  5.  * Revision..: $Revision:   1.3  $
  6.  * Log file..: $Logfile:   E:/nanfor/src/atprompt.prv  $
  7.  * 
  8.  * This is an original work by Ted Means and is placed in the
  9.  * public domain.
  10.  *
  11.  * Modification history:
  12.  * ---------------------
  13.  *
  14.  * $Log:   E:/nanfor/src/atprompt.prv  $
  15.  * 
  16.  *    Rev 1.3   15 Aug 1991 23:06:20   GLENN
  17.  * Forest Belt proofread/edited/cleaned up doc
  18.  * 
  19.  *    Rev 1.2   14 Jun 1991 17:53:30   GLENN
  20.  * Added support for "RB" color spec as well as "BR"
  21.  * 
  22.  *    Rev 1.1   10 May 1991 23:47:56   GLENN
  23.  * Fixed documentation bug.  The doc headers referred to the function as
  24.  * ft_atprompt() when it is really ft_prompt().  
  25.  * 
  26.  *    Rev 1.0   01 Apr 1991 01:00:38   GLENN
  27.  * Nanforum Toolkit
  28.  *
  29.  */
  30.  
  31. /*  $DOC$
  32.  *  $FUNCNAME$
  33.  *     @...PROMPT
  34.  *  $CATEGORY$
  35.  *     Menus/Prompts
  36.  *  $ONELINER$
  37.  *     Define a menu item for use with MENU TO
  38.  *  $SYNTAX$
  39.  *     #include "FTMENUTO.CH"
  40.  *
  41.  *     @ <nRow>, <nCol> PROMPT <cMenuItem>                           ;
  42.  *                             [ PROMPTCOLOR <cPromptColor> ]        ;
  43.  *                             [ MESSAGE <cItemMessage> ]            ;
  44.  *                             [ MSGROW <nMessageRow> ]              ;
  45.  *                             [ MSGCOL <nMessageCol> ]              ;
  46.  *                             [ MSGCOLOR <cMsgColor> ]              ;
  47.  *                             [ HOTKEY <nHotKeyPosition> ]          ;
  48.  *                             [ HOTKEYCOLOR <cHotKeyColor> ]        ;
  49.  *                             [ BARCOLOR <cBarColor> ]              ;
  50.  *                             [ BARHOTKEYCOLOR <cBarHotKeyColor> ]  ;
  51.  *                             [ UP <nUp> ]                          ;
  52.  *                             [ DOWN <nDown> ]                      ;
  53.  *                             [ RIGHT <nRight> ]                    ;
  54.  *                             [ LEFT <nLeft> ]
  55.  *  $ARGUMENTS$
  56.  *     <nRow> is the row at which the prompt is to appear.
  57.  *
  58.  *     <nCol> is the column at which the prompt will appear.
  59.  *
  60.  *     <cMenuItem> is the menu item to display.
  61.  *
  62.  *     <cPromptColor> is optional and is the color attribute of the
  63.  *     prompt. If not specified, the default is the current
  64.  *     standard color as supplied by the SetColor() function.
  65.  *
  66.  *     <cItemMessage> is optional and is the message associated with
  67.  *     the prompt. If not specified, then no message will be displayed.
  68.  *
  69.  *     <nMessageRow> is optional and is the row at which the
  70.  *     message, if any, will appear.  If not specified, the default
  71.  *     is the current setting of the SET MESSAGE TO command.
  72.  *
  73.  *     <nMessageCol> is optional and is the column at which the
  74.  *     message, if any, will appear.  If not specified, the default
  75.  *     is either zero or centered, depending on the current setting
  76.  *     of the CENTER option of the SET MESSAGE TO command.
  77.  *
  78.  *     <cMsgColor> is optional and is the color attribute of
  79.  *     the message. If not specified, the default is the current
  80.  *     standard color as reported by the SetColor() function.
  81.  *
  82.  *     <nHotKeyPosition> is optional and is the position within the
  83.  *     prompt string where the hotkey is located.  If not
  84.  *     specified, the default is one.
  85.  *
  86.  *     <cHotKeyColor> is optional and is the color attribute of the
  87.  *     hotkey character.  If not specified, the default is the same
  88.  *     color as the rest of the prompt.
  89.  *
  90.  *     <cBarColor> is optional and is the color attribute of
  91.  *     the light bar when it is positioned on this prompt.  If not
  92.  *     specified, the default is the current enhanced color setting
  93.  *     as returned by the SetColor() function.
  94.  *
  95.  *     <cBarHotKeyColor> is optional and is the color
  96.  *     attribute of the hotkey when the light bar is positioned on
  97.  *     this prompt.  If not specified, the default is the same
  98.  *     color as the rest of the light bar.
  99.  *
  100.  *     <nUp> is optional and specifies which prompt becomes active
  101.  *     when the up arrow key is pressed.  If not specified, the
  102.  *     default is the previous prompt.  The current setting of SET
  103.  *     WRAP TO is obeyed.
  104.  *
  105.  *     <nDown> is optional and specifies which prompt becomes
  106.  *     active when the down arrow key is pressed.  If not
  107.  *     specified, the default is the next prompt.  The current
  108.  *     setting of SET WRAP TO is obeyed.
  109.  *
  110.  *     <nRight> is optional and specifies which prompt becomes
  111.  *     active when the right arrow key is pressed.  If not
  112.  *     specified, the default is the next prompt.  The current
  113.  *     setting of SET WRAP TO is obeyed.
  114.  *
  115.  *     <nLeft> is optional and specifies which prompt becomes
  116.  *     active when the left arrow is pressed.  If not specified,
  117.  *     the default is the previous prompt.  The current setting of
  118.  *     SET WRAP TO is obeyed.
  119.  *  $DESCRIPTION$
  120.  *     This enhanced version of @...PROMPT requires the inclusion of
  121.  *     the header file FTMENUTO.CH in any source file that uses it.
  122.  *     It is compatible with, and may be used in place of, the standard
  123.  *     Clipper @...PROMPT command.
  124.  *
  125.  *     Clipper's @...PROMPT and MENU TO commands are fine as far as
  126.  *     they go.  But many times you need more flexibility.  As
  127.  *     you'll no doubt notice if you read the argument list, this
  128.  *     function is almost completely flexible. You can adjust
  129.  *     locations and colors for every part of the prompt and its
  130.  *     associated message.  In addition, since you can control the
  131.  *     effect of the arrow keys, you can allow both horizontal and
  132.  *     vertical movement, or even disable certain arrow keys if you
  133.  *     so desire.
  134.  *
  135.  *     Note that this command can also be called using function-style
  136.  *     syntax.  See the entry for FT_PROMPT() for further details.
  137.  *
  138.  *     Also note that this command calls an internal routine called
  139.  *     __FTPROMPT(). __FTPROMPT() was written in assembler.  Check
  140.  *     the file TMENU.ASM if you're interested in seeing the
  141.  *     assembler source code.
  142.  *
  143.  *     All the examples below use the command version.  If you're
  144.  *     interested in seeing the function version, compile the
  145.  *     examples with the /P switch and then examine the resulting
  146.  *     .PPO file.
  147.  *  $EXAMPLES$
  148.  *    #include "FTMENUTO.CH"
  149.  *    // Simple prompt
  150.  *    @ 1, 1 PROMPT "Menu choice #1"
  151.  *
  152.  *    // Prompt with color
  153.  *    @ 3, 1 PROMPT "Menu choice #2" PROMPTCOLOR W+/R
  154.  *
  155.  *    // Prompt with a message
  156.  *    @ 5, 1 PROMPT "Menu choice #3" MESSAGE "Go to lunch"
  157.  *
  158.  *    // Prompt with pinpoint message control
  159.  *    @ 7, 1 PROMPT "Menu choice #4" MESSAGE "Drop Dead" ;
  160.  *                   MSGROW 22 MSGCOL 4 MSGCOLOR GR+/N
  161.  *
  162.  *    // Prompt with a unique lightbar color
  163.  *    @ 9, 1 PROMPT "Menu choice #5" BARCOLOR BG+/W
  164.  *
  165.  *    // Prompt with a hotkey ("#" character)
  166.  *    @11, 1 PROMPT "Menu choice #6" HOTKEY 13
  167.  *
  168.  *    // Prompt with pinpoint hotkey control
  169.  *    @13, 1 PROMPT "Menu Choice #7" HOTKEY 13 ;
  170.  *                   HOTKEYCOLOR R+/BG BARHOTKEYCOLOR G+/N
  171.  *
  172.  *    // Prompt with right and left arrow keys disabled
  173.  *    @15, 1 PROMPT "Menu Choice #8" RIGHT 8 LEFT 8
  174.  *  $INCLUDE$
  175.  *     FTMENUTO.CH
  176.  *  $SEEALSO$
  177.  *    "MENU TO" FT_PROMPT() FT_MENUTO()
  178.  *  $END$
  179.  */
  180.  
  181.  
  182. /*  $DOC$
  183.  *  $FUNCNAME$
  184.  *     FT_PROMPT()
  185.  *  $CATEGORY$
  186.  *     Menus/Prompts
  187.  *  $ONELINER$
  188.  *     Define a menu item for use with FT_MENUTO()
  189.  *  $SYNTAX$
  190.  *     FT_PROMPT( <nPromptRow>,               ;
  191.  *                <nPromptCol>,               ;
  192.  *                <cPrompt>,                  ;
  193.  *              [ <cPromptColor> ],           ;
  194.  *              [ <nMessageRow> ],            ;
  195.  *              [ <nMessageCol> ],            ;
  196.  *              [ <cMessage> ],               ;
  197.  *              [ <cMessageColor> ],          ;
  198.  *              [ <nHotKeyPosition> ],        ;
  199.  *              [ <cHotKeyColor> ],           ;
  200.  *              [ <cLightBarColor> ],         ;
  201.  *              [ <cLightBarHotKeyColor> ],   ;
  202.  *              [ <nUp> ],                    ;
  203.  *              [ <nDown> ],                  ;
  204.  *              [ <nRight> ],                 ;
  205.  *              [ <nLeft> ] )          -> NIL
  206.  *
  207.  *  $ARGUMENTS$
  208.  *     <nPromptRow> is the row at which the prompt is to appear.
  209.  *
  210.  *     <nPromptCol> is the column at which the prompt will appear.
  211.  *
  212.  *     <cPrompt> is the prompt's text.
  213.  *
  214.  *     <cPromptColor> is optional and is the color attribute of the
  215.  *     prompt. If not specified, the default is the current
  216.  *     standard color as supplied by the SetColor() function.
  217.  *
  218.  *     <nMessageRow> is optional and is the row at which the
  219.  *     message, if any, will appear.  If not specified, the default
  220.  *     is the current setting of the SET MESSAGE TO command.
  221.  *
  222.  *     <nMessageCol> is optional and is the column at which the
  223.  *     message, if any, will appear.  If not specified, the default
  224.  *     either zero or centered, depending on the current setting of
  225.  *     the CENTER option of the SET MESSAGE TO command.
  226.  *
  227.  *     <cMessage> is optional and is the message associated with
  228.  *     the prompt. If not specified, then no message will be displayed.
  229.  *
  230.  *     <cMessageColor> is optional and is the color attribute of
  231.  *     the message. If not specified, the default is the current
  232.  *     standard color as reported by the SetColor() function.
  233.  *
  234.  *     <nHotKeyPosition> is optional and is the position within the
  235.  *     prompt string where the hotkey is located.  If not
  236.  *     specified, the default is 1.
  237.  *
  238.  *     <cHotKeyColor> is optional and is the color attribute of the
  239.  *     hotkey character.  If not specified, the default is the same
  240.  *     color as the rest of the prompt.
  241.  *
  242.  *     <cLightBarColor> is optional and is the color attribute of
  243.  *     the light bar when it is positioned on this prompt.  If not
  244.  *     specified, the default is the current enhanced color setting
  245.  *     as returned by the SetColor() function.
  246.  *
  247.  *     <cLightBarHotKeyColor> is optional and is the color
  248.  *     attribute of the hotkey when the light bar is positioned on
  249.  *     this prompt.  If not specified, the default is the same
  250.  *     color as the rest of the light bar.
  251.  *
  252.  *     <nUp> is optional and specifies which prompt becomes active
  253.  *     when the up arrow key is pressed.  If not specified, the
  254.  *     default is the previous prompt.  The current setting of SET
  255.  *     WRAP TO is obeyed.
  256.  *
  257.  *     <nDown> is optional and specifies which prompt becomes
  258.  *     active when the down arrow key is pressed.  If not
  259.  *     specified, the default is the next prompt.  The current
  260.  *     setting of SET WRAP TO is obeyed.
  261.  *
  262.  *     <nRight> is optional and specifies which prompt becomes
  263.  *     active when the right arrow key is pressed.  If not
  264.  *     specified, the default is the next prompt.  The current
  265.  *     setting of SET WRAP TO is obeyed.
  266.  *
  267.  *     <nLeft> is optional and specifies which prompt becomes
  268.  *     active when the left arrow is pressed.  If not specified,
  269.  *     the default is the previous prompt.  The current setting of
  270.  *     SET WRAP TO is obeyed.
  271.  *  $RETURNS$
  272.  *     NIL
  273.  *  $DESCRIPTION$
  274.  *     This function is a replacement for Clipper's @...PROMPT
  275.  *     command.  In fact, you may wish to consult FTMENUTO.CH, which
  276.  *     contains a user-defined command that closely adheres to
  277.  *     standard Clipper syntax and makes this function infinitely
  278.  *     easier to use.  I strongly recommend using the command
  279.  *     version because the large number of possible arguments makes
  280.  *     the function version too prone to error.
  281.  *
  282.  *     Clipper's @...PROMPT and MENU TO commands are fine as far as
  283.  *     they go.  But many times you need more flexibility.  As
  284.  *     you'll no doubt notice if you read the argument list, this
  285.  *     function is almost completely flexible. You can adjust
  286.  *     locations and colors for every part of the prompt and its
  287.  *     associated message.  In addition, since you can control the
  288.  *     effect of the arrow keys, you can allow both horizontal and
  289.  *     vertical movement, or even disable certain arrow keys if you
  290.  *     so desire.
  291.  *
  292.  *     Note that this function calls an internal routine called
  293.  *     __FTPROMPT(). __FTPROMPT() was written in assembler.  Check
  294.  *     the file TMENU.ASM if you're interested in seeing the
  295.  *     assembler source code.
  296.  *
  297.  *     All the examples below use the command version.  If you're
  298.  *     interested in seeing the function version, compile the
  299.  *     examples with the /P switch and then examine the resulting
  300.  *     .PPO file.
  301.  *  $EXAMPLES$
  302.  *    #include "FTMENUTO.CH"
  303.  *    // Simple prompt
  304.  *    @ 1, 1 PROMPT "Menu choice #1"
  305.  *
  306.  *    // Prompt with color
  307.  *    @ 3, 1 PROMPT "Menu choice #2" PROMPTCOLOR W+/R
  308.  *
  309.  *    // Prompt with a message
  310.  *    @ 5, 1 PROMPT "Menu choice #3" MESSAGE "Go to lunch"
  311.  *
  312.  *    // Prompt with pinpoint message control
  313.  *    @ 7, 1 PROMPT "Menu choice #4" MESSAGE "Drop Dead" ;
  314.  *                   MSGROW 22 MSGCOL 4 MSGCOLOR GR+/N
  315.  *
  316.  *    // Prompt with a unique lightbar color
  317.  *    @ 9, 1 PROMPT "Menu choice #5" BARCOLOR BG+/W
  318.  *
  319.  *    // Prompt with a hotkey ("#" character)
  320.  *    @11, 1 PROMPT "Menu choice #6" HOTKEY 13
  321.  *
  322.  *    // Prompt with pinpoint hotkey control
  323.  *    @13, 1 PROMPT "Menu Choice #7" HOTKEY 13 ;
  324.  *                   HOTKEYCOLOR R+/BG BARHOTKEYCOLOR G+/N
  325.  *
  326.  *    // Prompt with right and left arrow keys disabled
  327.  *    @15, 1 PROMPT "Menu Choice #8" RIGHT 8 LEFT 8
  328.  *  $SEEALSO$
  329.  *    "MENU TO" "@...PROMPT" FT_MENUTO()
  330.  *  $END$
  331.  */
  332.  
  333. #include "set.ch"
  334.  
  335. function FT_Prompt( nPRow, nPCol, cPrompt,  cPAttr, ;
  336.                     nMRow, nMCol, cMessage, cMAttr, ;
  337.                     nHKeyPos, cHKeyAttr, cLBarAttr, ;
  338.                     cLBHKAttr, nUp, nDown, nRight,  ;
  339.                     nLeft  )
  340.  
  341. local nPLoc, nMLoc, nHKeyLoc, nPAttr, nMAttr, nHKeyAttr, nHKeyVal, nLBarAttr
  342. local nLBHKAttr
  343.  
  344. local cCurColor := setcolor()
  345. local cStdColor := left(cCurColor, at(",", cCurColor) - 1)
  346. local cEnhColor := right(cCurColor, len(cCurColor) - len(cStdColor) - 1)
  347.  
  348. cEnhColor := left(cEnhColor, at(",", cEnhColor) - 1)
  349.  
  350. if valtype(nPRow) != "N"
  351.    nPRow := 0
  352. endif
  353.  
  354. if valtype(nPCol) != "N"
  355.    nPCol := 0
  356. endif
  357.  
  358. if valtype(cPrompt) != "C"
  359.    cPrompt := ""
  360. endif
  361.  
  362. if valtype(cPAttr) != "C"
  363.    cPAttr := cStdColor
  364. endif
  365.  
  366. if valtype(cMessage) != "C"
  367.    cMessage := ""
  368. endif
  369.  
  370. if valtype(nMRow) != "N"
  371.    nMRow := set(_SET_MESSAGE)
  372. endif
  373.  
  374. if valtype(nMCol) != "N"
  375.    if set(_SET_MCENTER)
  376.       nMCol := round( (maxcol() - len(cMessage)) / 2, 0 )
  377.    else
  378.       nMCol := 0
  379.    endif
  380. endif
  381.  
  382. if valtype(cMAttr) != "C"
  383.    cMAttr := cStdColor
  384. endif
  385.  
  386. if valtype(nHKeyPos) != "N" .or. nHKeyPos > len(cPrompt) .or. nHKeyPos < 1
  387.    nHKeyPos := 1
  388.    do while substr( cPrompt, nHKeyPos, 1 ) == " " .AND. nHKeyPos < Len(cPrompt)
  389.       nHKeypos++
  390.    enddo
  391. endif
  392.  
  393. if valtype(cHKeyAttr) != "C"
  394.    cHKeyAttr := cPAttr
  395. endif
  396.  
  397. if valtype(cLBarAttr) != "C"
  398.    cLBarAttr := cEnhColor
  399. endif
  400.  
  401. if valtype(cLBHKAttr) != "C"
  402.    cLBHKAttr := cLBarAttr
  403. endif
  404.  
  405. if valtype(nUp) != "N"
  406.    nUp := 0
  407. endif
  408.  
  409. if valtype(nDown) != "N"
  410.    nDown := 0
  411. endif
  412.  
  413. if valtype(nRight) != "N"
  414.    nRight := 0
  415. endif
  416.  
  417. if valtype(nLeft) != "N"
  418.    nLeft := 0
  419. endif
  420.  
  421. nPLoc := ((nPRow * (MaxCol() + 1)) + nPCol) * 2
  422. nMLoc := ((nMRow * (MaxCol() + 1)) + nMCol) * 2
  423.  
  424. nHKeyLoc := nPLoc + ((nHKeyPos - 1) * 2)
  425. nHKeyVal := asc(upper(substr(cPrompt, nHKeyPos, 1)))
  426.  
  427. nPAttr := _ftNColor(cPAttr)
  428. nMAttr := _ftNColor(cMAttr)
  429.  
  430. nHKeyAttr := _ftNColor(cHKeyAttr)
  431. nLBarAttr := _ftNColor(cLBarAttr)
  432. nLBHKAttr := _ftNColor(cLBHKAttr)
  433.  
  434. __ftPrompt( nPLoc, cPrompt, nPAttr, nMLoc, cMessage, nMAttr, ;
  435.            nHKeyAttr, nHKeyLoc, nHKeyVal, nLBarAttr,        ;
  436.            nLBHKAttr, nUp, nDown, nRight, nLeft )
  437.  
  438. return NIL
  439.  
  440.  
  441.  
  442. static function _ftNColor(cColor)
  443.  
  444. local nAttr := 0
  445. local cColr := upper(cColor)
  446. local cFore := left(cColr, at("/", cColr) - 1)
  447. local cBack := right(cColr, len(cColr) - at("/", cColr))
  448.  
  449. do case
  450.    case "BG" $ cFore
  451.       nAttr := 3
  452.    case ( "BR" $ cFore ) .or. ( "RB" $ cFore )
  453.       nAttr := 5
  454.    case "GR" $ cFore
  455.       nAttr := 6
  456.    case "N" $ cFore .or. "I" $ cColr
  457.       nAttr := 0
  458.    case "B" $ cFore .or. "U" $ cColr
  459.       nAttr := 1
  460.    case "G" $ cFore
  461.       nAttr := 2
  462.    case "R" $ cFore
  463.       nAttr := 4
  464.    case "W" $ cFore
  465.       nAttr := 7
  466. endcase
  467.  
  468. do case
  469.    case "BG" $ cBack
  470.       nAttr += 48
  471.    case ( "BR" $ cBack ) .or. ( "RB" $ cBack )
  472.       nAttr += 80
  473.    case "GR" $ cBack
  474.       nAttr += 96
  475.    case "N" $ cBack
  476.       nAttr += 0
  477.    case "B" $ cBack
  478.       nAttr += 16
  479.    case "G" $ cBack
  480.       nAttr += 32
  481.    case "R" $ cBack
  482.       nAttr += 64
  483.    case "W" $ cBack .or. "I" $ cColr
  484.       nAttr += 112
  485. endcase
  486.  
  487. if "+" $ cFore .or. substr(cColor, 1, 2) == "I+"
  488.    nAttr += 8
  489. endif
  490.  
  491. if "*" $ cFore .or. "+" $ cBack
  492.    nAttr += 128
  493. endif
  494.  
  495. return nAttr
  496. 
  497.